const testMarkdownText = `

第一篇博客内容够多了，因为正则表达式内容很丰富，因此单独拆分成2篇博客

这是一个[百度连接](www.baidu.com)

## 字符串中支持正则的方法
|  方法 |  说明 |  示例 |
| :------------: | :------------: | :------------: |
| \`search\`  | 返回第一个匹配首个符号位置  | \`str.search(/\d{4}/)\`  |
| \`replace\`  | 替换对应的字符串，默认只替换**第一个**，全局模式会替换所有  | \`str.replace(/\d{3}-(\d{8})/g, '$1')\`  |
|  \`match\` | 返回匹配的字符串数组，全局模式不会返回细节  | 略  |
| \`matchAll\`  | 返回一个迭代器可以遍历,**必须是全局模式**  | 略  |
| \`split\`  | 按照给定字符串作为分隔符，进行拆分  | \`str.split(/[-\/]/)\`  |

### replace方法
字符串的\`replace()\`还有一个有趣的细节，再次强调，默认情况下**只会替换第一个匹配的**，在
全局模式下会替换所有的。

之前已经用到过，被替换的时候使用\`$n\`表示第n个分组内容，此外$\`表示匹配串**左侧**的内容，$'表示匹配串右边的内容

例如s.replace(/liangyan/, "$\`")就是把liangyan替换为它左侧的内容

| 语法  | 意义  |
| :------------: | :------------: |
| \`$&\`  | 匹配的串本身  |
| \`$n\`  | 第n个分组的内容  |
| $\`  |  整个匹配串左侧的内容 |
| \`$'\`  | 整个匹配串右侧的内容  |

## 分组别名
之前我们获取分组的方案都是通过数组索引，实际上我们可以为分组取别名，更方便地获取分组

### 语法
为分组取别名需要在正则表达式中声明，之前禁止分组是在分组前加上\`?:\`，类似的，取分组别名的
方法是在分组前加上\`?<alias>\`，注意需要有两个尖括号

\`\`\`javascript
let s = '022-89896578'
let reg = /\d{3}-(?<tel>\d{8})/;
console.log(s.match(reg).groups);	//{tel: "89896578"}
\`\`\`
所以我们用\`matchAll()\`得到迭代器，然后通过\`groups\`获得这个“字典”

#### 在replace中使用别名
在\`replace()\`中，同样需要加上\`$\`表示特殊含义，具体语法是\`$<alias>\`

\`\`\`javascript
let s = '022-89896578'
let reg = /(?<prefix>\d{3})-(?<tel>\d{8})/;
let res = s.replace(reg, "$<prefix>:$<tel>");
console.log(res);	//022:89896578
\`\`\`

## 正则表达式的方法
| 语法  | 说明  |
| :------------: | :------------: |
| \`test\`  |  检测字符串中是否有匹配正则的子串 |
| \`exec\`  | 每次会匹配一个子串，返回细节，常用于循环反复匹配。通过\`lastIndex\`属性记录状态  |

## 断言匹配
有些时候我们期望在正则表达式中出现“条件语句”

例如匹配“后面紧跟博客二字的liangyan字符”
### 零宽先行断言
（我也不知道为啥是这么拗口的名字）
用于表明正则表达式**后面紧跟的条件**，语法是\`?=\`

\`\`\`javascript
let s = 'liangyan.fun, liangyan博客';
let reg = /liangyan(?=博客)/gi;
console.log(s.match(reg));		//["liangyan"]
\`\`\`
能够发现只匹配到了1个\`liangyan\`，因为这个正则表达式要求后面必须是博客，同时**条件并不会纳入匹配结果**

> 断言并不是分组，因此不会加入组中

### 小例子
我们希望把下面字符串\`s\`中的1位数月份，前面加上0，但是日不会变化
\`\`\`javascript
let s = \`
date: 2019年 5月 3日
date: 2020年 7月 10日
date: 2020年 10月 9日
\`
let reg = /(\d+)(?=月)/gi
s = s.replace(reg, function(...args){
	if(args[1].length < 2){
		args[1] = '0' + args[1];
	}
	return args[1];
})
console.log(s);
\`\`\`

### 零宽后行断言
这个就是在正则**前面加上“条件”**，语法是\`?<=\`

同样，这里的断言**不是一个组，不会纳入正则匹配结果中**

\`\`\`javascript
let s = '黄良liangyan,liangyan黄良';
let reg = /(?<=黄良)liangyan/gi;
console.log(s.match(reg));		//["liangyan"]
\`\`\`
上面的例子只会匹配\`liangyan\`前有\`黄良\`的子串

### 零宽负向先行断言
（名字更拗口了。。。）
之前的\`?=\`是限制后面必须是某个特定的模式，我们也可以**限制后面不是某个模式**

语法是\`?!\`，同样的不是组，也不会加入到匹配结果中

下面使用负向断言，让用户名中**不能出现**liang这一个子串，并且是3-8位之间的纯字母
\`\`\`javascript
const input = document.querySelector('body input[name="username"]');
input.addEventListener('keyup', function(){
	const value = this.value;
	let reg = /^(?!.*liang.*)[a-z]{3,8}$/i;
	if(!value.match(reg)){
		console.log('用户名不正确');
	}else{
		console.log('正确');
	}
});
\`\`\`
正则意义是，限制开头后面不能跟带有\`liang\`的串（\`.*liang.*\`前后都有\`.*\`），后跟
3-8位的字母，这个限制是很巧妙的，此外还注意断言并不在匹配中，因此后面的才是真正匹配3-8位纯字母的

### 零宽负向后行断言
限制正则**前面不能是某个模式**，语法是\`?<!\`，不是一个组，不会加入匹配结果中
`

export default testMarkdownText;